#include <stdio.h>

//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定
//如：输入9，输出9 * 9口诀表，输出12，输出12 * 12的乘法口诀表。

//
//1*1=1
//2*1=2 2*2=4
//3*1=3 3*2=6 3*3=9
//
//void print_table(int m)
//{
//	int i = 0;
//	for (i = 1; i <= m; i++)
//	{
//		//打印一行
//		int j = 0;
//		for (j = 1; j <= i; j++)
//		{
//			printf("%-2d*%-2d=%-3d ", i, j, i * j);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);//9 12 5
//	//打印对应的乘法口诀表
//	print_table(n);
//	return 0;
//}
//

//int Fun(int n)
//{
//    if (n == 5)
//        return 2;
//    else
//        return 2 * Fun(n + 1);
//}
//
//int main()
//{
//    printf("%d\n", Fun(2));
//    return 0;
//}
//
#include <math.h>
//
//double Pow(int n, int k)
//{
//	if (k > 0)
//		return n * Pow(n, k - 1);
//	else if (k == 0)
//		return 1.0;
//	else
//		return 1.0 / Pow(n, -k);
//}
//
//
//int main()
//{
//	int n = 0;
//	int k = 0;
//	scanf("%d %d", &n, &k);
//	printf("%lf\n", Pow(n, k));
//	return 0;
//}


//计算一个数的每位之和（递归实现）
//题目内容：
//写一个递归函数DigitSum(n)，输入一个非负整数，返回组成它的数字之和
//例如，调用DigitSum(1729)，则应该返回1 + 7 + 2 + 9，它的和是19
//输入：1729，输出：19

//
//DigitSum(1729)
//DigitSum(172) + 9
//DigitSum(17) + 2 +9
//DigitSum(1) + 7 + 2 + 9
//
//
//int DigitSum(int n)
//{
//	if (n > 9)
//		return DigitSum(n / 10) + n % 10;
//	else
//		return n;
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = DigitSum(n);
//	printf("%d\n", ret);
//
//	return 0;
//}

//编写一个函数 reverse_string(char* string)（递归实现）
//实现：将参数字符串中的字符反向排列，不是逆序打印。
//要求：不能使用C函数库中的字符串操作函数。
//比如 :
//char arr[] = "abcdef";
//逆序之后数组的内容变成：fedcba

//
#include <string.h>

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//void reverse_string(char* str)
//{
//	int left = 0;
//	int right = my_strlen(str)-1;
//	while (left<right)
//	{
//		char tmp = *(str + left);
//		*(str + left) = *(str + right);
//		*(str + right) = tmp;
//		left++;
//		right--;
//	}
//}

//void reverse_string(char* str)
//{
//	int len = my_strlen(str);
//	char tmp = *str;//1
//	*str = *(str + len - 1);//2
//	*(str + len - 1) = '\0';//3
//	if(my_strlen(str+1)>=2)
//		reverse_string(str+1);//4
//	*(str + len - 1) = tmp;//5
//}
//
//int main()
//{
//	//char arr[] = "abcdef";
//	char arr[] = "abcdef";
//	reverse_string(arr);
//	printf("%s\n", arr);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[] = { 1,2,(3,4),5 };
//	printf("%d\n", sizeof(arr));
//	return 0;
//}

//
//#include <stdio.h>
//int main()
//{
//	char str[] = "hello bit";
//	//[h e l l o _ b i t \0]
//	printf("%d %d\n", sizeof(str), strlen(str));
//	//10 9
//	return 0;
//}
//

//将数组A中的内容和数组B中的内容进行交换。（数组一样大）
//数组名是常量的地址，不能多数组名进行赋值或者++--的操作
//
//int main()
//{
//	int arr1[5] = { 1,3,5,7,9 };
//	int arr2[5] = { 2,4,6,8,0 };
//	int i = 0;
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	int tmp = 0;
//	for (i = 0; i < sz; i++)
//	{
//		tmp = arr1[i];
//		arr1[i] = arr2[i];
//		arr2[i] = tmp;
//	}
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	printf("\n");
//
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	printf("\n");
//
//	return 0;
//}
//
//

//创建一个整形数组，完成对数组的操作
//实现函数init() 初始化数组为全0
//实现print()  打印数组的每个元素
//实现reverse()  函数完成数组元素的逆置。
//要求：自己设计以上函数的参数，返回值。
//void init(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr[i] = 0;
//	}
//}
//
//void print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void reverse(int arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//
//	while (left<right)
//	{
//		int tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//	int  sz = sizeof(arr) / sizeof(arr[0]);
//	print(arr, sz);
//	reverse(arr, sz);
//	print(arr, sz);
//	init(arr, sz);
//	print(arr, sz);
//	return 0;
//}
//

//int main()
//{
//	int a = 10;//a是整形，占用4个字节的内存空间，每个字节都有对应的地址
//	
//	int* pa = &a;//&a - 得到的是a的地址（指针），其实得到的是a所占内存中4个字节中第一个字节的地址，pa是指针变量
//
//	pa = 10;
//
//	return 0;
//}

//int main()
//{
//	//char c;//1
//	//short s;//2
//	//int i;//4
//
//	//char* pc;//4
//	//short* ps;//4
//	//int* pi;//4
//
//	//printf("%zu\n", sizeof(char*));
//	//printf("%zu\n", sizeof(short*));
//	//printf("%zu\n", sizeof(int*));
//
//
//	return 0;
//}

//
//指针类型决定了，在解引用指针的时候能访问几个字节
//

//int main()
//{
//	int a = 0x11223344;
//	/*int* pa = &a;
//	*pa = 0;*/
//	char* pc = &a;//int*
//	*pc = 0;
//
//	return 0;
//}
//


//指针类型的第二个意义
//指针类型决定了，指针进行+1、-1的时候，一步走多远
//
//
//int main()
//{
//	int a = 10;
//	int*  pa = &a;
//	char* pc = &a;
//	printf("%p\n", pa);
//	printf("%p\n", pa+1);
//
//	printf("%p\n", pc);
//	printf("%p\n", pc+1);
//
//	return 0;
//}
//
//
//
//int main()
//{
//	int arr[10] = {0};
//	char* p = &arr[0];
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*p = i + 1;
//		p++;
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}
//

//err
//int main()
//{
//	int* p;
//	*p = 20;
//
//	return 0;
//}
//
//
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i <= 11; i++)
//	{
//		//当指针指向的范围超出数组arr的范围时，p就是野指针
//		*(p++) = i;
//	}
//	return 0;
//}
//

//int* test()
//{
//	int a = 10;
//	return &a;
//}
//int main()
//{
//	int*p = test();
//	*p = 100;
//	return 0;
//}

//
//int main()
//{
//	int a = 10;
//	int* p = &a;
//
//	//一个指针不知道应该指向哪里的时候，暂时可以初始化为NULL;
//	//int* p = NULL;
//	if (p != NULL)
//	{
//		*p = 100;
//	}
//
//	return 0;
//}